#!/usr/bin/env node

/**
 * Whistle 客户端国际化功能测试脚本
 * 用于验证语言包和语言切换功能是否正常工作
 */

const fs = require('fs');
const path = require('path');

console.log('🧪 开始测试 Whistle 客户端国际化功能...\n');

// 测试文件路径
const i18nDir = path.join(__dirname, 'public/i18n');
const zhCNFile = path.join(i18nDir, 'zh-CN.json');
const enUSFile = path.join(i18nDir, 'en-US.json');
const languageSwitcherFile = path.join(i18nDir, 'language-switcher.js');
const settingsFile = path.join(__dirname, 'public/settings.html');
const menuFile = path.join(__dirname, 'lib/menu.js');

// 测试结果
let testResults = {
  passed: 0,
  failed: 0,
  total: 0
};

function test(name, testFn) {
  testResults.total++;
  try {
    testFn();
    console.log(`✅ ${name}`);
    testResults.passed++;
  } catch (error) {
    console.log(`❌ ${name}: ${error.message}`);
    testResults.failed++;
  }
}

// 测试1: 检查国际化目录是否存在
test('检查国际化目录', () => {
  if (!fs.existsSync(i18nDir)) {
    throw new Error('国际化目录不存在');
  }
});

// 测试2: 检查中文语言包文件
test('检查中文语言包文件', () => {
  if (!fs.existsSync(zhCNFile)) {
    throw new Error('中文语言包文件不存在');
  }
  
  const content = fs.readFileSync(zhCNFile, 'utf8');
  const data = JSON.parse(content);
  
  // 检查必要的翻译键
  const requiredKeys = ['settings', 'menu', 'messages'];
  requiredKeys.forEach(key => {
    if (!data[key]) {
      throw new Error(`缺少必要的翻译键: ${key}`);
    }
  });
  
  // 检查设置界面的翻译
  if (!data.settings.proxyPort || !data.settings.cancel || !data.settings.apply) {
    throw new Error('设置界面翻译不完整');
  }
});

// 测试3: 检查英文语言包文件
test('检查英文语言包文件', () => {
  if (!fs.existsSync(enUSFile)) {
    throw new Error('英文语言包文件不存在');
  }
  
  const content = fs.readFileSync(enUSFile, 'utf8');
  const data = JSON.parse(content);
  
  // 检查必要的翻译键
  const requiredKeys = ['settings', 'menu', 'messages'];
  requiredKeys.forEach(key => {
    if (!data[key]) {
      throw new Error(`缺少必要的翻译键: ${key}`);
    }
  });
});

// 测试4: 检查语言切换器文件
test('检查语言切换器文件', () => {
  if (!fs.existsSync(languageSwitcherFile)) {
    throw new Error('语言切换器文件不存在');
  }
  
  const content = fs.readFileSync(languageSwitcherFile, 'utf8');
  
  // 检查必要的类和方法
  if (!content.includes('class LanguageSwitcher')) {
    throw new Error('缺少 LanguageSwitcher 类定义');
  }
  
  if (!content.includes('switchLanguage')) {
    throw new Error('缺少 switchLanguage 方法');
  }
  
  if (!content.includes('getText')) {
    throw new Error('缺少 getText 方法');
  }
});

// 测试5: 检查设置界面HTML
test('检查设置界面HTML', () => {
  if (!fs.existsSync(settingsFile)) {
    throw new Error('设置界面文件不存在');
  }
  
  const content = fs.readFileSync(settingsFile, 'utf8');
  
  // 检查国际化属性
  if (!content.includes('data-i18n=')) {
    throw new Error('缺少国际化属性标记');
  }
  
  // 检查语言选择器
  if (!content.includes('languageSelect')) {
    throw new Error('缺少语言选择器');
  }
  
  // 检查语言切换器引用
  if (!content.includes('language-switcher.js')) {
    throw new Error('缺少语言切换器引用');
  }
});

// 测试6: 检查菜单文件
test('检查菜单文件', () => {
  if (!fs.existsSync(menuFile)) {
    throw new Error('菜单文件不存在');
  }
  
  const content = fs.readFileSync(menuFile, 'utf8');
  
  // 检查国际化支持
  if (!content.includes('getText(')) {
    throw new Error('菜单文件缺少国际化支持');
  }
  
  // 检查语言包加载
  if (!content.includes('loadLanguagePack')) {
    throw new Error('菜单文件缺少语言包加载功能');
  }
});

// 测试7: 验证语言包结构一致性
test('验证语言包结构一致性', () => {
  const zhCN = JSON.parse(fs.readFileSync(zhCNFile, 'utf8'));
  const enUS = JSON.parse(fs.readFileSync(enUSFile, 'utf8'));
  
  // 检查顶级键是否一致
  const zhKeys = Object.keys(zhCN);
  const enKeys = Object.keys(enUS);
  
  if (zhKeys.length !== enKeys.length) {
    throw new Error('语言包顶级键数量不一致');
  }
  
  zhKeys.forEach(key => {
    if (!enUS[key]) {
      throw new Error(`英文语言包缺少键: ${key}`);
    }
  });
  
  // 检查设置界面的键是否一致
  const zhSettingsKeys = Object.keys(zhCN.settings);
  const enSettingsKeys = Object.keys(enUS.settings);
  
  if (zhSettingsKeys.length !== enSettingsKeys.length) {
    throw new Error('设置界面翻译键数量不一致');
  }
});

// 测试8: 检查语言包内容质量
test('检查语言包内容质量', () => {
  const zhCN = JSON.parse(fs.readFileSync(zhCNFile, 'utf8'));
  
  // 检查中文翻译是否为空
  Object.entries(zhCN.settings).forEach(([key, value]) => {
    if (!value || value.trim() === '') {
      throw new Error(`设置界面翻译为空: ${key}`);
    }
  });
  
  Object.entries(zhCN.menu).forEach(([key, value]) => {
    if (!value || value.trim() === '') {
      throw new Error(`菜单翻译为空: ${key}`);
    }
  });
});

console.log('\n📊 测试结果汇总:');
console.log(`总测试数: ${testResults.total}`);
console.log(`通过: ${testResults.passed}`);
console.log(`失败: ${testResults.failed}`);
console.log(`成功率: ${((testResults.passed / testResults.total) * 100).toFixed(1)}%`);

if (testResults.failed === 0) {
  console.log('\n🎉 所有测试通过！国际化功能配置正确。');
  console.log('\n📝 下一步:');
  console.log('1. 启动 Whistle 客户端: npm start');
  console.log('2. 打开设置界面 (Ctrl+,)');
  console.log('3. 测试语言切换功能');
  console.log('4. 验证界面显示是否正确');
} else {
  console.log('\n⚠️  有测试失败，请检查相关配置。');
  process.exit(1);
}
